package com.xuecheng.content.controller;

import com.xuecheng.api.content.model.FileManagerApi;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.RandomStringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

@Slf4j
@RestController
public class FileManagerController implements FileManagerApi {
    // todo 创建restTemplate对象,远程调用的对象  ,依靠RestTemplate 创建
    @Autowired
    private RestTemplate restTemplate;
    /*nacos的参数
            #文件系统微服的请求地址，就是url路径
                   file.service.url=http://127.0.0.1:56082/farming/generatetoken?origin=qiniu
            #文件存储空间名称  自己的七牛云存储空间的名称
                     file.service.bucket= xc-133-static-lly
            #文件存储区域的地址  指的是地区华东还是华北  就是建立仓库时选的是哪个地区
                     file.service.upload.region = http://upload.qiniu.com
            #文件访问的cdn加速域名   就是复制图片相关链接  自己七牛云CND域名(例如：http://r17rw3nlv.hd-bkt.clouddn.com/3.png)  只要  r17rw3nlv.hd-bkt.clouddn.com
                       cdn.domain = r17rw3nlv.hd-bkt.clouddn.com
            #token操作类型,   1 表示获取上传凭证  还有其他的例如 2 下载凭证
                  file.tokenType = 1
            #  表示凭证的时长,单位是秒
                  file.token.deadline = 3600
     */

     //todo 获取nacos中配置的参数
    @Value("${file.service.url}")
    private String url;
    @Value("${file.service.bucket}")
    private String bucket;
    @Value("${file.service.upload.region}")
    private String region;
    @Value("${cdn.domain}")
    private String domain;
    @Value("${file.tokenType}")
    private String tokenType;
    @Value("${file.token.deadline}")
    private Integer deadline;

    @Override
    @GetMapping("common/qnUploadToken")
    public Map<String, Object> generateUploadToken() {
        // todo 构建请求体的json数据,是map格式
        Map<String, Object> dataMap = new HashMap<>();
        dataMap.put("tokenType", tokenType);   //凭证,上传还是下载
        dataMap.put("scope", bucket);           // 文件存储空间名称  自己的七牛云存储空间的名称
        dataMap.put("deadline", deadline);        // 时间,凭证时间
        String fileKey= UUID.randomUUID().toString()+ RandomStringUtils.randomAlphabetic(16);//自定义产生上传文件的名称
        dataMap.put("key", fileKey);  //上传文件的名称
         /*参数解析:
               1 url前端的请求地址
               2 dataMap:
                       请求参数:
                         以map集合方式书写
              3 Map.class 后端响应前端的数据是什么格式,可以自定义一个类将响应的数据封装起来
         *    4 queryString数据  指url路径?后面的参数
                             这里并不需要添加这个参数,因为在url路径上有该参数
         */
        //todo 1 主要进行远程调用获取上传凭证或下载凭证  还有其他响应头,响应数据,  这些数据是直接封装在ResponseEntity对象中的
        ResponseEntity<Map> response = restTemplate.postForEntity(url, dataMap, Map.class);
        /*todo 2
                 body  包括响应头(code),响应数据(msg), 前段进行上传,下载的凭证(result)
                  这些参数是ResponseEntity对象中的 body对象直接封装好的
         */
        Map body = response.getBody();
         // todo 将参数进行封装响应给前端,前端要什么数据,会给出文档
        dataMap.put("qnToken",body.get("result"));  //从后端获取到的凭证
        dataMap.put("up_region",region);  //文件存储区域的地址  指的是地区华东还是华北  就是建立仓库时选的是哪个地区
        dataMap.put("domain",domain);     //文件访问的cdn加速域名   就是复制图片相关链接  自己七牛云CND域名(例如：http://r17rw3nlv.hd-bkt.clouddn.com/3.png)  只要  r17rw3nlv.hd-bkt.clouddn.comcdn.domain = r17rw3nlv.hd-bkt.clouddn.com

        return dataMap;
    }
}
